#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h" /* 引入 gpio 外设 */
#include "esp_freertos_hooks.h"
#include "esp_log.h"
#include "sdkconfig.h"
#include "system.h"
#include "xtp_btn.h"
#include "led_74hc595.h"

/* 函数声明 */
void show_task(void *arg);
void led4_task(void *arg);
void tick_callback_hook(void);

void ec11_btn_callback(void);
void user_btn_callback(void);

/* 全局变量定义 */
portMUX_TYPE mmux = portMUX_INITIALIZER_UNLOCKED;
xtp_btn_t ok_btn;
xtp_btn_t user_btn;
TaskHandle_t ledD4_taskHandle = NULL;
TaskHandle_t show_task_handle = NULL;
static const char *TAG = "example";

/**
 * @brief 该函数不要用来执行初始化之类的操作，我们只让该函数执行一次。
 *        如果要该函数不退出一直运行下去可以在函数尾部加上 while(1)
 */
void app_main(void)
{
    xtp_system_init(&xtp_system); /* system 初始化 */

    ok_btn = xtp_btn_create(EC11_BTN_IO, "OK_BTN", ec11_btn_callback);    /* 创建一个按键 */
    user_btn = xtp_btn_create(USE_BTN_IO, "USER_BTN", user_btn_callback); /* 创建一个按键 */

    /* 注册 Tick 钩子函数 */
    esp_err_t tick_create_result;
    tick_create_result = esp_register_freertos_tick_hook(tick_callback_hook);
    if (tick_create_result == ESP_OK)
    {
        ESP_LOGI(TAG, "tick_callback_hook() 钩子注册成功");
    }
    else
    {
        ESP_LOGI(TAG, "tick_callback_hook() 钩子注册失败");
    }

    /* 创建任务 */
    xTaskCreate(show_task, "show_task", 1024 * 2, NULL, 1, &show_task_handle);
    if (show_task_handle == NULL)
    {
        ESP_LOGI(TAG, "show_Task 任务创建失败");
    }
}

/**
 * 显示任务
 */
void show_task(void *arg)
{
    hc595_init();
    hc74595_display(0);
    uint32_t ulValue = 0;
    while (1)
    {
        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
        ulValue++;
        if (ulValue >= 10)
        {
            xtp_system.StateLed.set_freq(100);
        }
        ESP_LOGI(TAG, "show_task: %ld", ulValue);
        taskENTER_CRITICAL(&mmux); /* 进入临界区 */
        hc74595_display(xtp_system.test_num);
        taskEXIT_CRITICAL(&mmux); /* 退出临界区 */
    }
}

/**
 * Tick 钩子函数，1ms 执行一次
 */
void tick_callback_hook(void)
{

    xtp_system.StateLed.state_led();

    key_scan(&ok_btn);
    key_scan(&user_btn);
}

/**
 * @brief EC11 按键回调函数
 */
void ec11_btn_callback(void)
{

    if (ok_btn.result == LOOP_PRESS)
    {
        ok_btn.press_time_num++;
        /* 每 100ms 执行一次 test_num++ */
        if (ok_btn.press_time_num >= 100)
        {
            xtp_system.test_num++;
            ok_btn.press_time_num = 0;
        }
    }
    
    if (ok_btn.click_count == 1)
    {
        xtp_system.test_num++;
    }
    if (ok_btn.click_count == 2)
    {
        xtp_system.test_num += 2;
    }
    if (ok_btn.click_count >= 3)
    {
        xtp_system.test_num = 0;
    }
    if (ok_btn.click_count == 0)
    {
        ok_btn.result = NO_CLICK;
    }
}

/**
 * @brief 用户按键回调函数
 */
void user_btn_callback()
{
    if (user_btn.click_count == 1)
    {
        xtp_system.test_num += 2;
    }

    if (user_btn.result == LOOP_PRESS)
    {
        user_btn.press_time_num++;
        /* 每 100ms 执行一次 test_num++ */
        if (user_btn.press_time_num >= 100)
        {
            xtp_system.test_num++;
            user_btn.press_time_num = 0;
        }
        // xtp_system.test_num = 0;
    }

    if (user_btn.click_count == 0)
    {
        user_btn.result = NO_CLICK;
    }
}